; ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ; ; Rip - off 1 ; ; (c) Will Yums & Design Design Software ; ; Hacked together by ; ; Chewrubba and Mottly ; ; Interrupts always display 3/7/83 ; ; Invaders generator works 6/7/83 ; ; Defender decided . 8/7/83 ; ; TMove0 OK 13/7/83 ; ; Men added 14/7/83 ; ; TMove1 OK 14/7/83 ; ; ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ LeftMargin EQU 27 RightMargin EQU 4 DownMargin EQU 0 UpMargin EQU 24 Space EQU 0 Mountain EQU 1 Ship EQU 2 DispFlag EQU 0 ;MUST BE 0 !!! DispTheta EQU 1 ;MUST BE 1 !!! DispY EQU 2 DisppShape EQU 3 DispSpeedV EQU 5 DispSpeedI EQU 6 DisppMove EQU 7 lThings EQU #1000 ;This is really too long . lThing EQU 32 MinThing EQU #10 MaxThing EQU 32 MinProj EQU #30 MaxProj EQU 32 MinExpl EQU #50 MaxExpl EQU 32 MinMen EQU #70 MaxMen EQU 16 MaxAll EQU MaxThing+MaxProj+MaxExpl+MaxMen HackSpeedI EQU 0 ManFallSpeed EQU 32 DisppOldAddr EQU 9 ; & #A DispMode EQU #B DisppBMPos EQU #C ; & #D DispDir EQU #E DisppMan EQU #F ; & #10 DispType EQU #11 LaserTableL EQU #100 LDFlag EQU 0 LDY EQU 1 LDpDisplayY EQU 2 ; & 3 LDTheta1 EQU 4 LDTheta2 EQU 5 LDDir EQU 6 LDpMove EQU 7 ; & 8 nLaser EQU 6 lLaser EQU 16 lLight EQU 8 ORG #8000 :DISP #7800 - $ JP Start CallHL JP (HL) ORG #8080 DEFB #C3 IntVec DEFW StandardInt StandardInt PUSH AF LD A,(nInterrupts) INC A LD (nInterrupts),A LD A,(StepRate) DEC A LD (StepRate),A JR Z StepScreen PUSH IX:PUSH IY:PUSH HL:PUSH DE PUSH BC:PUSH AF CALL RemoveFromBM CALL DrawScreen CALL ClearRest CALL ClearDList CALL PlaceDList CALL PlaceRest CALL PlaceInBM POP AF:POP BC:POP DE:POP HL:POP IY POP IX POP AF:EI RET StepScreen PUSH HL CALL MoveShip LD HL,(pRateTable) LD A,(HL) AND #7 JR NZ SSMove INC A SSMove LD (StepRate),A POP HL POP AF EI RET ORG $!#FF+1 Start CALL CLS DI :IM 2 CALL DefineInts CALL DefineRate TestEntry CALL CreateTable CALL CreateAllThs CALL PlaceRest CALL ClearLasers LD HL,DataTable LD (pNewPos),HL LD (pOldPos),HL CALL InitScreen EI TestLoop CALL HackMove LD BC,65278 IN A,(C) BIT 1,A CALL Z SetLeft BIT 2,A CALL Z SetRight LD BC,32766 IN A,(C) BIT 3,A CALL Z SetUp BIT 2,A CALL Z SetDown CALL CheckFire LD BC,32766 IN A,(C) BIT 0,A JR NZ TestLoop DI RET HackMove LD A,(HackSpeed) DEC A LD (HackSpeed),A RET NZ LD HL,HMloopE1 LD (HackVec),HL LD A,(HackSpeedI) LD (HackSpeed),A LD IX,ThingTable LD B,MaxAll HMloop PUSH BC BIT 0,(IX) JR NZ HMloopE DEC (IX+DispSpeedV) JR NZ HMloopE LD A,(IX+DispSpeedI) LD (IX+DispSpeedV),A CALL HackIntVec LD HL,HMloopE PUSH HL LD L,(IX+DisppMove) LD H,(IX+DisppMove+1) JP (HL) HMloopE DEFB #C3 HackVec DEFW HMloopE1 HMloopE1 CALL HackBIntVec:LD DE,lThing ADD IX,DE POP BC DJNZ HMloop RET HackIntVec LD HL,HackIntHand LD (IntVec),HL RET HackBIntVec LD HL,StandardInt LD (IntVec),HL RET HackIntHand PUSH HL LD HL,HackApresInt LD (HackVec),HL POP HL RET HackApresInt CALL StandardInt LD HL,HMloopE1 LD (HackVec),HL JR HMloopE1 SetLeft PUSH AF LD A,1 LD (LeftF),A POP AF RET SetRight PUSH AF LD A,1 LD (RightF),A POP AF RET SetUp PUSH AF LD A,1 LD (UpF),A POP AF RET SetDown PUSH AF LD A,1 LD (DownF),A POP AF RET CheckFire LD BC,65022 IN A,(C) OR #E0 INC A JR Z CFNotPressed LD A,(FireF1) OR A RET NZ INC A LD (FireF1),A LD (FireF),A RET CFNotPressed XOR A LD (FireF1),A RET StepNPRight LD DE,(pNewPos) LD HL,EndDataTable OR A SBC HL,DE JR NZ StepNPR1 LD DE,DataTable StepNPR1 LD HL,4 ADD HL,DE LD (pNewPos),HL LD A,(nViewTheta) INC A LD (nViewTheta),A RET StepNPLeft LD DE,(pNewPos) LD HL,DataTable OR A SBC HL,DE JR NZ StepNPL1 LD DE,EndDataTable StepNPL1 LD HL,0-4 ADD HL,DE LD (pNewPos),HL LD A,(nViewTheta) DEC A LD (nViewTheta),A RET DefineRate LD HL,RateTable+1 LD DE,RateTable-1 DRloop LD A,(HL) OR #80 LD (DE),A INC HL DEC DE CP #FF JR NZ DRloop LD HL,RateTable LD (pRateTable),HL RET MoveShLeft PUSH AF LD A,1 LD (nDir),A LD A,LeftMargin LD (MarginX),A LD A,(ShipTheta) DEC A LD (nShipTheta),A POP AF RET MoveShRight PUSH AF LD A,0 LD (nDir),A LD A,RightMargin LD (MarginX),A LD A,(ShipTheta) INC A LD (nShipTheta),A POP AF RET ClearBigMaze LD HL,BigMaze LD DE,BigMaze+1 LD BC,#1800 LD (HL),Space LDIR RET RemoveFromBM EQU $ ; use ShipTheta / Dir LD A,(ShipY) LD B,A LD A,(ShipTheta) CALL ConvertBMXY RFBM1 LD A,(HL):AND #80:LD (HL),A INC L LD A,(HL):AND #80:LD (HL),A RET PlaceInBM EQU $ ; use nShipTheta / nDir LD A,(ShipY) LD B,A LD A,(ShipTheta) CALL ConvertBMXY PIBM1 LD A,(HL):AND #7F:JR NZ ShipHSummat INC L LD A,(HL):AND #7F:JR NZ ShipHSummat LD A,(HL):OR Ship:LD (HL),A DEC L LD A,(HL):OR Ship:LD (HL),A RET ShipHSummat LD A,(BorderCol):INC A:AND #7 LD (BorderCol),A OUT (#FE),A RET ConvertBMXY LD L,A LD A,B AND #1F ADD A,BigMaze/256 LD H,A RET ClearDList EQU $ ; This removes everything ; visible from old ViewTheta XOR A:LD (ShippyF),A LD A,(nShipTheta):LD B,A LD A,(ShipTheta):CP B CALL NZ SetShippyF LD A,(nViewTheta):LD B,A LD A,(ViewTheta):CP B CALL NZ SetShippyF LD A,(nShipY):LD B,A LD A,(ShipY):CP B CALL NZ SetShippyF LD A,(ShippyF):OR A JR Z ClearDList1 CALL CalcShippy LD (ShipAddr),HL LD (nShipShape),DE ClearDList1 LD A,(nViewTheta):LD (ViewTheta),A LD A,(nShipTheta):LD (ShipTheta),A LD A,(nShipY):LD (ShipY),A LD A,(nDir):LD (Dir),A RET PlaceDList EQU $ ; This places everything ; visible from new ViewTheta LD A,(ShippyF):OR A RET Z CALL CalcShippy PUSH HL EXX LD HL,(ShipAddr) LD DE,(nShipShape) PUSH HL EXX LD B,8 PDListLoop1 LD A,(DE) XOR (HL) LD (HL),A INC H INC DE EXX LD A,(DE) XOR (HL) LD (HL),A INC H INC DE EXX DJNZ PDListLoop1 EXX LD B,8 POP HL INC L EXX POP HL INC L EXX PDListLoop2 LD A,(DE) XOR (HL) LD (HL),A INC H INC DE EXX LD A,(DE) XOR (HL) LD (HL),A INC H INC DE EXX DJNZ PDListLoop2 RET SetShippyF LD A,1 LD (ShippyF),A RET CalcShippy EQU $ LD A,(ViewTheta) LD B,A LD A,(ShipTheta) SUB B LD (ShipX),A PUSH AF LD A,(ShipY) LD L,A LD H,0 ADD HL,HL LD DE,ConvertYT ADD HL,DE LD E,(HL) INC HL LD D,(HL) POP AF LD L,A LD H,0 ADD HL,DE LD DE,(cShipShape) RET PutShippy CALL CalcShippy LD B,8 PUSH HL PDLloop LD A,(DE) XOR (HL) LD (HL),A INC H INC DE DJNZ PDLloop POP HL LD B,8 INC L PDLloop1 LD A,(DE) XOR (HL) LD (HL),A INC H INC DE DJNZ PDLloop1 POP AF RET InitScreen LD IY,(pNewPos) LD DE,0 ISloop LD L,(IY) LD H,(IY+1) ADD HL,DE LD BC,ISdelret PUSH BC LD C,(IY+2) LD B,(IY+3) PUSH BC RET ISdelret LD BC,4 ADD IY,BC INC DE LD A,E CP 32 JR NZ ISloop CALL PutShippy RET ClearThings LD HL,ThingTable LD DE,ThingTable+1 LD BC,lThings LD (HL),1 LDIR RET CreateAllThs CALL ClearThings LD B,MaxThing ;No to create CATloop PUSH BC LD A,R AND #3 LD A,0 JR NZ CATloop1 LD A,1 CATloop1 CALL CreateThing POP BC DJNZ CATloop LD B,MaxMen CATloop2 PUSH BC CALL CreateMan POP BC DJNZ CATloop2 RET PlaceRest LD A,(nViewTheta) LD C,A LD B,MaxAll LD DE,lThing LD HL,ThingTable AlienLoop LD IY,0 BIT 1,(HL) CALL NZ Doit3 BIT 0,(HL) JP NZ NextAlien1 INC HL LD A,(HL) DEC HL SUB C CP 32 JR NC NextAlien1 CALL Doit NextAlien ADD HL,DE DJNZ AlienLoop RET NextAlien1 BIT 1,(HL) JR Z NextAlien PUSH HL PUSH HL POP IX LD HL,Doit4 PUSH HL LD L,(IX+DisppShape) LD H,(IX+DisppShape+1) PUSH HL PUSH IY POP HL RET Doit4 POP HL JR NextAlien LD H,(IX+DisppShape+1) Doit PUSH BC PUSH DE PUSH HL PUSH HL POP IX EX AF,AF' LD L,(IX+DispY) LD H,0 ADD HL,HL LD DE,ConvertYT ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX AF,AF' LD L,A LD H,0 ADD HL,DE PUSH IY POP DE OR A SBC HL,DE JR Z Doit1 ADD HL,DE LD DE,Doit2 PUSH DE LD E,(IX+DisppShape) LD D,(IX+DisppShape+1) PUSH DE RET Doit2 LD DE,Doit1 PUSH DE LD E,(IX+DisppShape) LD D,(IX+DisppShape+1) PUSH DE PUSH IY POP HL RET Doit1 POP HL POP DE POP BC RET Doit3 PUSH HL PUSH HL POP IX LD A,(IX+DisppOldAddr) DEFB #FD : LD L,A LD A,(IX+DisppOldAddr+1) DEFB #FD : LD H,A POP HL RET ClearRest LD A,(ViewTheta) LD C,A LD B,MaxAll LD DE,lThing LD HL,ThingTable CRloop RES 1,(HL) BIT 0,(HL) JR NZ CR1 INC HL LD A,(HL) DEC HL SUB C CP 32 CALL C CR2 CR1 ADD HL,DE DJNZ CRloop RET CR2 SET 1,(HL) PUSH BC PUSH DE PUSH HL PUSH HL POP IX EX AF,AF' LD L,(IX+DispY) LD H,0 ADD HL,HL LD DE,ConvertYT ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX AF,AF' LD L,A LD H,0 ADD HL,DE LD (IX+DisppOldAddr),L LD (IX+DisppOldAddr+1),H POP HL POP DE POP BC RET CreateThing LD C,MinThing PUSH AF LD HL,ThingTable LD B,MaxThing LD DE,lThing CIloop1 LD A,(HL) OR A JR NZ CI1 ADD HL,DE INC C DJNZ CIloop1 POP AF RET CI1 POP AF PUSH BC PUSH HL POP IX LD (IX+DispType),A LD L,A LD H,0 ADD HL,HL ADD HL,HL LD DE,TShapeTable ADD HL,DE LD A,(HL) LD (IX+DisppShape),A INC HL LD A,(HL) LD (IX+DisppShape+1),A INC HL LD A,(HL) LD (IX+DisppMove),A INC HL LD A,(HL) LD (IX+DisppMove+1),A LD A,R AND #0F INC A LD (IX+DispSpeedV),A LD (IX+DispSpeedI),A CALL GetTSpace LD (IX+DispTheta),A LD (IX+DispY),B POP BC LD (HL),C LD (IX+DisppBMPos),L LD (IX+DisppBMPos+1),H LD (IX+DispMode),0 LD A,R AND #1 LD (IX+DispDir),A LD (IX+DispFlag),0 RET GTS1 POP AF ;AAARGH! GetTSpace LD A,R ;Returns A = Theta B = Y AND #1F CP 21 JR C GTS2 LD A,21 GTS2 LD B,A LD A,R ADD A,A PUSH AF PUSH BC CALL ConvertBMXY POP BC LD A,(HL) OR A JR NZ GTS1 POP AF RET CreateMan LD A,R ADD A,A LD L,A LD H,ManHeight/256 BIT 7,(HL) JR Z CreateMan RES 7,(HL) DEC (HL) CALL FindTTSpace RET C LD (IX+DispTheta),L LD A,(HL) LD (IX+DispY),A LD HL,ManShape LD (IX+DisppShape),L LD (IX+DisppShape+1),H LD A,ManFallSpeed LD (IX+DispSpeedV),A LD (IX+DispSpeedI),A LD HL,ManMove LD (IX+DisppMove),L LD (IX+DisppMove+1),H LD (IX+DispMode),0 LD (IX+DispDir),0 LD (IX+DispType),8 LD (IX+DispFlag),0 RET FindTTSpace LD IX,ThingTable LD B,MaxAll LD DE,lThing:OR A FTTS1 BIT 0,(IX) RET NZ ADD IX,DE DJNZ FTTS1 SCF RET TShapeTable DEFW TShape0 : DEFW TMove0 DEFW TShape1 : DEFW TMove1 DEFW TShape0 : DEFW TMove0 DEFW TShape0 : DEFW TMove0 DEFW TShape0 : DEFW TMove0 DEFW TShape0 : DEFW TMove0 DEFW TShape0 : DEFW TMove0 DEFW TShape0 : DEFW TMove0 TShape0 LD A,(HL) XOR #7E LD (HL),A INC H LD A,(HL) XOR #99 LD (HL),A INC H LD A,(HL) XOR #99 LD (HL),A INC H LD A,(HL) XOR #7E LD (HL),A INC H LD A,(HL) XOR #66 LD (HL),A INC H LD A,(HL) XOR #C3 LD (HL),A RET TShape1 LD A,#FC :XOR (HL):LD (HL),A:INC H LD A,#84 :XOR (HL):LD (HL),A:INC H LD A,#BF :XOR (HL):LD (HL),A:INC H LD A,#A1 :XOR (HL):LD (HL),A:INC H LD A,#A1 :XOR (HL):LD (HL),A:INC H LD A,#E1 :XOR (HL):LD (HL),A:INC H LD A,#21 :XOR (HL):LD (HL),A:INC H LD A,#3F :XOR (HL):LD (HL),A RET ManShape LD A,#38 :XOR (HL):LD (HL),A:INC H LD A,#38 :XOR (HL):LD (HL),A:INC H LD A,#92 :XOR (HL):LD (HL),A:INC H LD A,#7C :XOR (HL):LD (HL),A:INC H LD A,#38 :XOR (HL):LD (HL),A:INC H LD A,#7C :XOR (HL):LD (HL),A:INC H LD A,#28 :XOR (HL):LD (HL),A:INC H LD A,#6C :XOR (HL):LD (HL),A RET ManMove LD A,(IX+DispMode) OR A RET Z RET TMove0 LD L,(IX+DisppBMPos) LD H,(IX+DisppBMPos+1) LD A,(HL) AND #80 LD (HL),A PUSH HL LD B,(IX+DispTheta) LD L,(IX+DispY) CALL InvertCell POP HL ; HL pts to BM old pos LD A,(IX+DispMode) OR A JR Z TM0MoveAll CP 1 JP Z TM0SwoopDown CP 2 JP Z TM0CarryUp CP 3 JP Z TM0Mutant JR TM0Exit TM0MoveAll LD L,(IX+DispTheta) LD E,(IX+DispY) LD H,MountHeight/256+1 BIT 7,(HL) JR Z TM0MAMF DEC H CALL TM0MA0 LD A,E OR A JP M TM0MoveAll CP UpMargin JR NC TM0Exit LD A,BigMaze/256 ADD A,E LD H,A LD A,(HL) OR A JR NZ TM0Exit LD (IX+DispTheta),L LD (IX+DispY),E TM0Exit1 LD (IX+DisppBMPos),L LD (IX+DisppBMPos+1),H TM0Exit LD L,(IX+DisppBMPos) LD H,(IX+DisppBMPos+1) LD A,(HL) OR MinThing LD (HL),A LD B,(IX+DispTheta) LD L,(IX+DispY) CALL InvertCell RET TM0MAMF INC (IX+DispMode) SET 7,(HL) CALL FindManEnt LD (IX+DisppMan),L LD (IX+DisppMan+1),H LD (IX+DispSpeedI),16 JR TM0Exit FindManEnt LD IY,ThingTable LD B,MaxAll LD DE,lThing FMEloop LD A,(IY+DispType) CP 8 JR NZ FMEloopEnd BIT 0,(IY+DispFlag) JR NZ FMEloopEnd LD A,(IY+DispTheta) CP L JR NZ FMEloopEnd PUSH IY POP HL RET FMEloopEnd ADD IY,DE DJNZ FMEloop LD HL,0 LD A,0 OUT (#FE),A RET TM0SwoopDown LD L,(IX+DispTheta) LD H,ManHeight/256 LD A,(HL) AND #7F INC A CP (IX+DispY) JR Z TM0SDEnd LD A,(IX+DispY) ADD A,BigMaze/256-1 LD H,A LD A,(HL) AND #7F JR NZ TM0Exit DEC (IX+DispY) JR TM0Exit1 TM0SDEnd INC (IX+DispMode) JR TM0Exit TM0CarryUp LD L,(IX+DispTheta) LD A,(IX+DispY) CP UpMargin-1 JR Z TM0CarryUpEnd ADD A,BigMaze/256+1 LD H,A LD A,(HL) AND #7F JP NZ TM0Exit INC (IX+DispY) PUSH HL PUSH IX LD L,(IX+DisppMan) LD H,(IX+DisppMan+1) PUSH HL POP IX CALL InvertCell0 INC (IX+DispY) CALL InvertCell0 POP IX POP HL JP TM0Exit1 TM0CarryUpEnd INC (IX+DispMode) LD (IX+DispSpeedI),1 LD L,(IX+DisppMan) LD H,(IX+DisppMan+1) PUSH IX PUSH HL POP IX CALL InvertCell0 SET 0,(IX+DispFlag) POP IX JP TM0Exit TM0Mutant LD A,R CP #20 JR C SillyMutant CALL T0Mutty MuttyCode LD A,BigMaze/256 ADD A,D LD H,A LD L,E LD A,(HL) AND #7F JP NZ TM0Exit LD (IX+DispY),D LD (IX+DispTheta),E JP TM0Exit1 T0Mutty LD A,(ShipTheta) SUB (IX+DispTheta) LD E,A JR NC T0Mutty1 NEG T0Mutty1 LD B,A LD A,(ShipY) SUB (IX+DispY) LD D,A JR NC T0Mutty2 NEG T0Mutty2 SUB B JR C T0Mutty3 LD E,(IX+DispTheta) BIT 7,D LD D,(IX+DispY) JR NZ T0Mutty2A INC D INC D T0Mutty2A DEC D RET T0Mutty3 LD D,(IX+DispY) BIT 7,E LD E,(IX+DispTheta) JR NZ T0Mutty3A INC E INC E T0Mutty3A DEC E RET SillyMutant LD D,(IX+DispY) LD E,(IX+DispTheta) LD A,R AND #F BIT 0,A JR NZ,MCode2 BIT 1,A JR NZ,MCode1 DEC D DEC D MCode1 INC D MCode2 BIT 2,A JP NZ,MuttyCode BIT 3,A JR NZ,MCode3 DEC E DEC E MCode3 INC E JP MuttyCode TM0MA0 LD A,R AND #7 CP 2 JR C TM0MA1b ;Stay Still CP 3 JR C TM0MA1a ;Opposite Dir'n LD A,(IX+DispDir) OR A JR Z TM0MA1 INC L INC L TM0MA1 DEC L JR TM0MA1b TM0MA1a LD A,(IX+DispDir) OR A JR NZ TM0MA1 INC L TM0MA1b LD A,(HL) INC A:INC A ; HACK *** SUB E JR Z TM0MA2 JR C TM0MA3 INC E RET TM0MA2 LD A,R AND #1 RET NZ TM0MA4 INC E RET TM0MA3 LD A,R AND #3 JR Z TM0MA4 CP 1 RET Z DEC E RET TMove1 LD L,(IX+DisppBMPos) LD H,(IX+DisppBMPos+1) LD A,(HL) AND #80 LD (HL),A PUSH HL LD B,(IX+DispTheta) LD L,(IX+DispY) CALL InvertCell POP HL ; HL pts to BM old pos CALL TM1Bomber LD A,BigMaze/256 ADD A,E LD H,A LD A,(HL) AND #7F JP NZ TM0Exit LD (IX+DispTheta),L LD (IX+DispY),E JP TM0Exit1 TM1Bomber LD L,(IX+DispTheta) LD E,(IX+DispY) LD A,(IX+DispDir) OR A JR NZ TM1a INC L INC L TM1a DEC L DEC E RET NZ LD E,UpMargin-1 RET InvertCell0 LD B,(IX+DispTheta) LD L,(IX+DispY) InvertCell LD H,0 ADD HL,HL LD DE,ConvertYT ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD A,(ViewTheta) SUB B NEG CP 32 RET NC LD L,A LD H,0 ADD HL,DE LD E,(IX+DisppShape) LD D,(IX+DisppShape+1) PUSH DE RET ClearLasers LD HL,LaserTable LD DE,LaserTable+1 LD BC,LaserTableL-1 LD (HL),1 LDIR RET MoveShip PUSH IX PUSH IY PUSH HL PUSH DE PUSH BC PUSH AF CALL RemoveFromBM LD HL,(pRateTable) LD A,(HL) OR A PUSH HL CALL Z MoveStill CALL NZ MoveShip1 POP HL LD A,(HL) OR A PUSH AF CALL P DecRight POP AF CALL M DecLeft LD A,(LeftF) LD B,A LD A,(RightF) XOR B CALL NZ MoveShip3 CALL TryIncLeft CALL TryIncRight LD (pRateTable),HL CALL PlaceInBM POP AF POP BC POP DE POP HL POP IY POP IX EI RETI MoveShip3 LD A,(LeftF) LD (ShipDirX),A RET MoveShip1 EQU $ ; Do not CALL M MoveShLeft ; alter CALL P MoveShRight ; the CALL NewScreen ; accumulator CALL NZ NewScreen ; Z if in sync CALL DrawScreen CALL ClearRest CALL ClearDList LD A,(ShipDirX) OR A LD HL,ShipShapeL JR NZ MoveShip2 LD HL,ShipShapeR MoveShip2 LD (cShipShape),HL CALL PlaceDList CALL PlaceRest RET DecRight OR A RET Z LD A,(RightF) OR A RET NZ DEC HL RET DecLeft OR A RET Z LD A,(LeftF) OR A RET NZ INC HL RET TryIncLeft LD A,(LeftF) OR A RET Z XOR A:LD (LeftF),A DEC HL LD A,(HL) CP #FF RET NZ INC HL RET TryIncRight LD A,(RightF) OR A RET Z XOR A:LD (RightF),A INC HL LD A,(HL) CP #FF RET NZ DEC HL RET NewScreen LD A,(nDir) OR A PUSH AF CALL NZ StepNPLeft POP AF CALL Z StepNPRight LD A,(ShipX) LD B,A LD A,(MarginX) CP B RET DrawScreen CALL DWupdown LD IX,(pNewPos) LD IY,(pOldPos) LD DE,0 NSloop LD L,(IY) LD H,(IY+1) ADD HL,DE LD BC,NSdelret PUSH BC LD C,(IY+2) LD B,(IY+3) PUSH BC RET NSdelret LD L,(IX) LD H,(IX+1) ADD HL,DE LD BC,NSinsret PUSH BC LD C,(IX+2) LD B,(IX+3) PUSH BC RET NSinsret LD BC,4 ADD IX,BC ADD IY,BC INC E LD A,E CP 32 JR NZ NSloop LD HL,(pNewPos) LD (pOldPos),HL ; Deal with lasers LD IX,LaserTable LD DE,lLaser LD B,nLaser DWLloop BIT 0,(IX+LDFlag) CALL Z DWLdoit ADD IX,DE DJNZ DWLloop RET DWLdoit PUSH DE PUSH BC LD A,(ViewTheta) CALL DrawLaser LD L,(IX+LDpMove) LD H,(IX+LDpMove+1) CALL CallHL BIT 0,(IX+LDFlag) LD A,(nViewTheta) CALL Z DrawLaser POP BC POP DE RET DrawLaser LD B,A ;Passed ViewTheta in A LD L,(IX+LDpDisplayY) LD H,(IX+LDpDisplayY+1) LD A,(IX+LDTheta1) LD C,A SUB (IX+LDTheta2) LD E,A LD A,C SUB B JP M DrawLaser1 CP 32 RET NC LD C,A ADD A,E CP 32 JR NC DrawLaser2 LD A,31 DrawLaser2 SUB C LD B,A LD A,C ADD A,L LD L,A DrawLaser3 LD A,(HL) CPL LD (HL),A INC L DJNZ DrawLaser3 RET DrawLaser1 ADD A,E RET M LD B,A JR DrawLaser3 IncLaserR LD A,(IX+LDTheta1) LD B,(IX+LDTheta2) INC A INC B INC B LD (IX+LDTheta1),A LD (IX+LDTheta2),B SUB B CP lLight RET C LD HL,DecLaserR LD (IX+LDpMove),L LD (IX+LDpMove+1),H RET DecLaserR LD A,(IX+LDTheta1) LD B,(IX+LDTheta2) INC A INC A INC B LD (IX+LDTheta1),A LD (IX+LDTheta2),B SUB B RET NZ SET 0,(IX+LDFlag) RET IncLaserL LD A,(IX+LDTheta1) LD B,(IX+LDTheta2) DEC A DEC A DEC B LD (IX+LDTheta1),A LD (IX+LDTheta2),B SUB B CP lLight RET C LD HL,DecLaserL LD (IX+LDpMove),L LD (IX+LDpMove+1),H RET DecLaserL LD A,(IX+LDTheta1) LD B,(IX+LDTheta2) DEC A DEC B DEC B LD (IX+LDTheta1),A LD (IX+LDTheta2),B SUB B RET NZ SET 0,(IX+LDFlag) RET FindLaserSp LD IX,LaserTable LD DE,lLaser LD B,nLaser OR A FLSloop BIT 0,(IX) RET NZ ADD IX,DE DJNZ FLSloop SCF RET FireIfNess LD A,(FireF) OR A RET Z XOR A LD (FireF),A CALL FindLaserSp LD A,(Dir) OR A LD A,(ShipTheta) JR NZ FIN1 DEC A DEC A FIN2 LD (IX+LDTheta1),A LD (IX+LDTheta2),A LD A,(ShipY) LD (IX+LDY),A LD L,A LD H,0 ADD HL,HL LD DE,ConvertYT ADD HL,DE LD A,(HL) LD (IX+LDpDisplayY),A INC HL LD A,(HL) ADD A,4 LD (IX+LDpDisplayY+1),A CALL WhichMove LD (IX+LDpMove),L LD (IX+LDpMove+1),H LD (IX+LDFlag),0 RET FIN1 ADD A,3 JR FIN2 WhichMove LD HL,IncLaserR LD A,(Dir) OR A RET NZ LD HL,IncLaserL RET PutTT LD A,(HL) CPL LD (HL),A RET PutBT LD A,1:XOR (HL):LD (HL),A INC H LD A,2:XOR (HL):LD (HL),A INC H LD A,4:XOR (HL):LD (HL),A INC H LD A,8:XOR (HL):LD (HL),A INC H LD A,#10:XOR (HL):LD (HL),A INC H LD A,#20:XOR (HL):LD (HL),A INC H LD A,#40:XOR (HL):LD (HL),A INC H LD A,#80:XOR (HL):LD (HL),A RET DEFM "Argh !" PutMB SET 2,H PutTM LD A,#C0:XOR (HL):LD (HL),A INC H LD A,#30:XOR (HL):LD (HL),A INC H LD A,#0C:XOR (HL):LD (HL),A INC H LD A,#03:XOR (HL):LD (HL),A RET DEFM "oooargh !" PutMM INC H INC H INC H LD A,(HL):CPL:LD (HL),A RET DEFM "Yeurch !" PutBM SET 2,H PutMT LD A,#03:XOR (HL):LD (HL),A INC H LD A,#0C:XOR (HL):LD (HL),A INC H LD A,#30:XOR (HL):LD (HL),A INC H LD A,#C0:XOR (HL):LD (HL),A INC H RET DEFM "gaga " PutTB LD A,#80 :XOR (HL):LD (HL),A INC H LD A,#40 :XOR (HL):LD (HL),A INC H LD A,#20 :XOR (HL):LD (HL),A INC H LD A,#10 :XOR (HL):LD (HL),A INC H LD A,#08 :XOR (HL):LD (HL),A INC H LD A,#04 :XOR (HL):LD (HL),A INC H LD A,#02 :XOR (HL):LD (HL),A INC H LD A,#01 :XOR (HL):LD (HL),A RET DEFM "Bluble Bluble Bluble " PutBB LD A,H ADD A,7 LD H,A LD A,(HL):CPL:LD (HL),A RET DWupdown LD A,(UpF) LD B,A LD A,(DownF) XOR B JR Z DWudexit LD A,B OR A PUSH AF CALL NZ MoveShipUp POP AF CALL Z MoveShipDown DWudexit XOR A LD (UpF),A LD (DownF),A RET MoveShipUp LD A,(nInterrupts):BIT 0,A:RET Z LD A,(ShipY) INC A CP UpMargin RET Z LD (nShipY),A RET MoveShipDown LD A,(nInterrupts):BIT 0,A:RET Z LD A,(ShipY) DEC A CP DownMargin RET Z LD (nShipY),A RET MoveStill PUSH AF CALL DrawScreen CALL ClearRest CALL ClearDList CALL PlaceDList CALL PlaceRest POP AF RET CreateTable CALL ClearBigMaze LD IX,OldDataTable LD IY,DataTable LD BC,#100 LD DE,0 LD HL,MountHeight CTloop PUSH HL PUSH BC PUSH DE CALL CTEntry POP DE PUSH DE CALL BMEntry POP DE LD BC,4 ADD IY,BC INC IX INC IX INC DE POP BC POP HL LD A,(IX-2) LD (HL),A INC H OR #80 LD (HL),A DEC H CPI JP V CTloop LD HL,DataTable LD DE,EndDataTable LD BC,200 LDIR LD HL,EndDataTable-200 LD DE,DataTable-200 LD BC,200 LDIR RET BMEntry LD B,(IX) ; 'Y' INC B LD HL,BigMaze ADD HL,DE LD DE,#100 BMEloop SET 7,(HL) ADD HL,DE DJNZ BMEloop RET CTEntry LD L,(IX) ; 'Y' LD H,0 ADD HL,HL LD DE,ConvertYT ADD HL,DE LD A,(HL) LD (IY),A INC HL LD A,(HL) LD (IY+1),A LD A,(IX+1) ; 'Char' SUB #80 LD L,A LD H,0 ADD HL,HL LD DE,AddressT ADD HL,DE LD A,(HL) LD (IY+2),A INC HL LD A,(HL) LD (IY+3),A RET DefineInts LD HL,IntTab LD DE,IntTab+1 LD BC,#100 LD (HL),#80 LDIR LD A,IntTab/256 LD I,A RET CLS LD HL,#4000 LD DE,#4001 LD BC,#1800 LD (HL),0 LDIR LD (HL),#F LD BC,#300 LDIR LD A,1:OUT (#FE),A RET pNewPos DEFW DataTable pOldPos DEFW DataTable LeftF DEFB 0 RightF DEFB 0 UpF DEFB 0 DownF DEFB 0 FireF DEFB 0 FireF1 DEFB 0 HackSpeed DEFB HackSpeedI nInterrupts DEFB 0 StepRate DEFB 1 Dir DEFB 0 nDir DEFB 0 ShipX DEFB 16 ShipTheta DEFB 17 nShipTheta DEFB 17 ShipY DEFB 16 nShipY DEFB 16 MarginX DEFB LeftMargin ViewTheta DEFB 0 nViewTheta DEFB 0 cShipShape DEFW ShipShapeL nShipShape DEFW 0 ShippyF DEFB 0 ShipDirX DEFB 0 ShipDirY DEFB 0 ShipAddr DEFW 0 BorderCol DEFB 0 pRateTable DEFW RateTable DEFS 100 ; Lower RateTable RateTable DEFB 0 DEFB 3 DEFB 2 DEFB 2 DEFB 2 DEFB 1 DEFB 2 DEFB 1 DEFB 1 DEFB 2 DEFB 1 DEFB 1 DEFB 1 DEFB 2 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 2 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB 1 DEFB #FF OldDataTable EQU $ DEFB #09,#80,#09,#80,#09,#80,#09,#80 DEFB #09,#80,#09,#80,#09,#80,#09,#80 DEFB #09,#80,#09,#80,#09,#80,#09,#80 DEFB #09,#80,#09,#80,#09,#80,#09,#80 DEFB #0A,#82,#0B,#82,#0C,#82,#0D,#82 DEFB #0E,#82,#0F,#82,#10,#82,#11,#82 DEFB #12,#82,#12,#80,#12,#80,#12,#86 DEFB #11,#86,#10,#86,#0F,#86,#0E,#80 DEFB #0E,#80,#0E,#80,#0E,#80,#0E,#80 DEFB #0E,#80,#0E,#86,#0D,#86,#0C,#86 DEFB #0B,#86,#0A,#80,#0A,#80,#0A,#80 DEFB #0A,#80,#0A,#80,#0A,#80,#0A,#80 DEFB #0A,#80,#0A,#86,#09,#86,#08,#86 DEFB #07,#86,#06,#80,#06,#80,#06,#80 DEFB #07,#82,#08,#82,#09,#82,#0A,#82 DEFB #0B,#82,#0C,#82,#0D,#82,#0E,#82 DEFB #0F,#82,#0F,#80,#0F,#80,#0F,#86 DEFB #0E,#86,#0D,#86,#0C,#86,#0B,#86 DEFB #0A,#86,#09,#83,#09,#81,#09,#83 DEFB #09,#81,#09,#83,#09,#81,#09,#83 DEFB #09,#87,#09,#82,#0A,#82,#0B,#82 DEFB #0C,#82,#0D,#82,#0E,#82,#0F,#82 DEFB #10,#82,#11,#82,#12,#82,#12,#80 DEFB #12,#80,#12,#80,#12,#80,#12,#86 DEFB #11,#86,#10,#86,#0F,#86,#0E,#86 DEFB #0D,#86,#0C,#86,#0B,#86,#0A,#86 DEFB #09,#86,#09,#82,#09,#86,#09,#82 DEFB #09,#86,#09,#82,#09,#86,#09,#82 DEFB #09,#80,#09,#80,#09,#80,#09,#80 DEFB #09,#80,#09,#80,#09,#80,#09,#80 DEFB #09,#80,#09,#80,#0A,#82,#0B,#82 DEFB #0C,#82,#0D,#82,#0E,#82,#0F,#82 DEFB #10,#82,#11,#82,#11,#80,#11,#80 DEFB #11,#80,#11,#80,#11,#80,#11,#80 DEFB #11,#80,#11,#80,#11,#80,#11,#80 DEFB #11,#80,#11,#80,#11,#80,#11,#80 DEFB #11,#80,#11,#80,#11,#80,#11,#80 DEFB #11,#80,#11,#80,#11,#80,#11,#80 DEFB #11,#80,#11,#80,#11,#86,#10,#86 DEFB #0F,#86,#0E,#86,#0D,#86,#0C,#86 DEFB #0B,#86,#0A,#86,#09,#86,#08,#80 DEFB #08,#80,#08,#80,#08,#80,#08,#80 DEFB #09,#82,#0A,#82,#0B,#82,#0C,#82 DEFB #0C,#86,#0B,#80,#0B,#80,#0B,#80 DEFB #0B,#80,#0B,#80,#0B,#80,#0B,#80 DEFB #0B,#80,#0C,#82,#0C,#86,#0B,#86 DEFB #0A,#86,#09,#86,#08,#86,#07,#86 DEFB #06,#86,#05,#86,#04,#86,#03,#86 DEFB #02,#83,#02,#81,#02,#83,#02,#81 DEFB #02,#83,#02,#81,#02,#83,#02,#81 DEFB #02,#83,#02,#81,#02,#83,#02,#81 DEFB #02,#83,#02,#81,#03,#82,#04,#82 DEFB #05,#82,#06,#82,#07,#82,#08,#82 DEFB #08,#80,#08,#80,#08,#80,#08,#80 DEFB #08,#80,#09,#82,#0A,#82,#0B,#82 DEFB #0C,#82,#0D,#82,#0D,#80,#0E,#82 DEFB #0E,#80,#0E,#86,#0D,#86,#0C,#86 DEFB #0B,#86,#0A,#86,#09,#80,#09,#80 DEFB #09,#80,#09,#80,#09,#80,#09,#80 DEFB #0A,#82,#0B,#82,#0B,#80,#0B,#80 DEFB #0B,#80,#0B,#80,#0B,#80,#0B,#86 DEFB #0A,#86,#09,#86,#08,#86,#07,#86 DEFB #07,#82,#08,#82,#09,#82,#09,#80 DEFB #09,#80,#09,#80,#09,#80,#09,#80 AddressT DEFW PutTT DEFW PutMT DEFW PutBT DEFW PutTM DEFW PutMM DEFW PutBM DEFW PutTB DEFW PutMB DEFW PutBB ConvertYT DEFW 0,#50E0,#50C0,#50A0,#5080 DEFW #5060,#5040,#5020,#5000 DEFW #48E0,#48C0,#48A0,#4880 DEFW #4860,#4840,#4820,#4800 DEFW #40E0,#40C0,#40A0,#4080 DEFW #4060,#4040,#4020,#4000 DEFW 0,0,0,0,0,0,0,0,0,0,0,0,0 DEFW 0,0,0,0,0,0,0,0,0,0,0,0,0 DEFW 0,0,0,0,0,0,0,0,0,0,0,0,0 ShipShapeR DEFB 0,#C0,#E0,#7F,#FF,#30, 0, 0 DEFB 0, 0, 0,#E0,#FF,#C0, 0, 0 ShipShapeL DEFB 0, 0, 0, 7,#FF, 3, 0, 0 DEFB 0, 3, 7,#FE,#FF,#0C, 0, 0 ORG $!#FF + 1 IntTab DEFS #101 DEFS 200 DataTable DEFS #400 EndDataTable DEFS 200 ORG $!#FF + 1 BigMaze DEFS #1800 MountHeight DEFS #100 ;Must be paged !! ManHeight DEFS #100 ;Must be here !! ThingTable DEFS lThings LaserTable DEFS LaserTableL ;Ship's lasers .